package br.com.esporte.view.site.grupo.preview;

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.Model;

import br.com.base.exception.NegociosException;
import br.com.esporte.exception.ViewException;
import br.com.esporte.model.Grupo;
import br.com.esporte.model.GrupoParticipante;
import br.com.esporte.model.Usuario;
import br.com.esporte.persistence.filter.FiltroGrupoParticipante;
import br.com.esporte.view.infra.generic.Pagina;
import br.com.esporte.view.site.component.image.ImageRelativePath;
import br.com.esporte.view.site.component.menu.MenuLateralComponente;
import br.com.esporte.view.site.component.menu.MenuEnum;
import br.com.esporte.view.site.component.menu.MenuLateral;
import br.com.esporte.view.site.grupo.comunidade.info.PaginaInfoComunidade;
import br.com.esporte.view.site.grupo.preview.participantes.PaginaListarParticipantes;
import br.com.esporte.view.site.template.PaginaTemplate;
import br.com.esporte.view.site.template.util.ConstantsTemplate;

/**
 * 
 * @author Milton Domingues
 *
 */
public class PaginaPreView extends PaginaTemplate {

	private static final String LINK_PARTICIPANTE_ID = "linkParticipar";
	private static final String LIST_MODERADORES_ID = "listModeradores";
	private static final String DESCRICAO_ID = "descricao";
	private static final String NOME_ID = "nome";
	private static final String IMG_MODERADOR_ID = "imgModerador";
	private static final String PRESIDENTE_ID = "presidente";
	private static final String PRESIDENTE_NOME_ID = "presidenteNome";
	private static final String MODERADOR_NOME_ID = "moderadorNome";

	private Grupo grupo;
	private List<Usuario> moderadores;


	public PaginaPreView(Grupo grupo, Pagina paginaRetorno) {
		super(paginaRetorno, MenuEnum.LISTAR_GRUPO);
		setGrupo(grupo);
		montarPagina();
	}

	@Override
	public void carregarView() {
		List<Usuario> usuarios = getFachada().consultarModeradores(getGrupo());
		setModeradores(usuarios);
	}

	private Link<Grupo> criarLinkParticipar(Grupo grupo, final Usuario usuario){

		Link<Grupo> link = new Link<Grupo>(LINK_PARTICIPANTE_ID, new Model<Grupo>(grupo)) {

			private static final long serialVersionUID = -4943987859907281241L;

			@Override
			public void onClick() {
				try{
					getFachada().solicitarIngressoGrupo(getGrupo(), usuario);
					setVisible(false);
				}catch (NegociosException e) {
					tratarException(e);
				}

			}
		};

		link.setVisible(!desabilitarLinkSolicitacao(grupo, getUsuarioLogado()));

		return link;
	}

	private ListView<Usuario> criarListModeradores(List<Usuario> usuarios){
		ListView<Usuario> usuariosList = new ListView<Usuario>(LIST_MODERADORES_ID, usuarios) {

			private static final long serialVersionUID = -4162861000327698485L;

			@Override
			protected void populateItem(ListItem<Usuario> item) {
				Usuario usuario = item.getModelObject();
				ImageRelativePath moderador = new ImageRelativePath(IMG_MODERADOR_ID, ConstantsTemplate.getPathImageUsuario(usuario.getImagem()));
				item.add(moderador);
				item.add(new Label(MODERADOR_NOME_ID, usuario.getNome()));
			}
		};
		return usuariosList;
	}

	private ImageRelativePath criarPresidente(Grupo grupo){
		Usuario usuario = grupo.getPresidente();
		ImageRelativePath img = new ImageRelativePath(PRESIDENTE_ID, ConstantsTemplate.getPathImageUsuario(usuario.getImagem()));
		return img;
	}

	private boolean desabilitarLinkSolicitacao(Grupo grupo, Usuario usuario){
		FiltroGrupoParticipante filtro = new FiltroGrupoParticipante();
		filtro.addEquals(FiltroGrupoParticipante.PARTICIPANTE, usuario);
		filtro.addEquals(FiltroGrupoParticipante.GRUPO, grupo);
		List<GrupoParticipante> list = getFachada().consultar(filtro);
		if(list.size() > 0){
			return true;
		}
		return false;
	}

	public Grupo getGrupo() {
		return grupo;
	}

	@Override
	public List<MenuLateral> getListaMenuPagina() {
		List<MenuLateral> menus = new ArrayList<MenuLateral>();

		Link<Pagina> event = new Link<Pagina>(MenuLateralComponente.LINK_MENU_ID) {

			private static final long serialVersionUID = 1L;

			@Override
			public void onClick() {
				try{
					setResponsePage(getPaginaRetorno());
				}catch (ViewException e) {
					redirectViewException(e);
				}
			}
		};
		menus.add(new MenuLateral(event, getMenuHome()));

		Link<Pagina> event2 = new Link<Pagina>(MenuLateralComponente.LINK_MENU_ID) {

			private static final long serialVersionUID = 1L;

			@Override
			public void onClick() {
				try{
					setResponsePage(new PaginaListarParticipantes(getGrupo(), getPaginaRetorno(), PaginaPreView.this));
				}catch (ViewException e) {
					redirectViewException(e);
				}
			}
		};
		menus.add(new MenuLateral(event2, MenuEnum.PARTICIPANTES));


		return menus;
	}

	public List<Usuario> getModeradores() {
		return moderadores;
	}

	@Override
	public String getTipoEsporte() {
		return grupo.getTipo().getCodigo();
	}

	@Override
	public void montarPagina() {
		super.montarPagina();
		addContainer(criarLinkParticipar(grupo, getUsuarioLogado()));
		addContainer(criarListModeradores(getModeradores()));
		addContainer(new Label(NOME_ID, grupo.getNome()));
		addContainer(new Label(DESCRICAO_ID, grupo.getDescricao()));
		addContainer(criarPresidente(grupo));
		addContainer(new Label(PRESIDENTE_NOME_ID, grupo.getPresidente().getNome()));
	}

	@Override
	public void redirectViewException(ViewException e) {
		setResponsePage(new PaginaInfoComunidade(getGrupo(), e.getMessage()));
	}

	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	public void setModeradores(List<Usuario> moderadores) {
		this.moderadores = moderadores;
	}

}
